/** Fichier définissant une forme de cylindre infini.
 *
 * Ce fichier déclare la classe BaseCylindre.
 *
 * @file BaseCylindre.hpp
 * @author Johan "Solo" Luisier
 *
 * @date 4 Juillet 2011
 */
#ifndef BASECYLINDRE_HPP
#define BASECYLINDRE_HPP

#include "FormeInfinie.hpp"

#include "boost/shared_ptr.hpp"

/** Classe implémentant un cylindre infini.
 *
 * Cette classe permet de définir un cylindre infini : càd sans aucune base. Il
 * n'est pas possible pour le moment d'utiliser une telle forme dans une scène.
 * Cette forme sert à définir un cylindre comme l'intersection d'une instance
 * de BaseCylindre et de deux instance de Plan.
 *
 * L'instance est définie par son axe de symétrie, son rayon et un point sur
 * son axe.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 4 Juillet 2011
 *
 * @class BaseCylindre "BaseCylindre.hpp" "Formes/BaseCylindre.hpp"
 */
class BaseCylindre : public FormeInfinie
{
public:
    /** Alias pour définir un pointeur intelligent.
     */
    typedef boost::shared_ptr< BaseCylindre > SharedPtr;
    BaseCylindre();
    BaseCylindre( const Vecteur& v, const Coord& a, const double& r );
    // constructeur de copie
    BaseCylindre( const BaseCylindre & );
    virtual ~BaseCylindre();

    Coord trouveIntersection( const Rayon & ) const;
    // renvoie le pt d'intersection

    VecteurU normale( Coord const & ) const;
    // renvoie la normale à un pt

    bool estDans( Coord const & ) const;
    // true si le pt est dans le cylindre

    bool estSur( Coord const & ) const;
    // true si le pt est à la surface

    void mapping( const Coord &pt, int &i, int &j, const int &frequence,
                  const int &Hauteur, const int &Largeur ) const;

    const VecteurU& axe() const;
    const Coord& sommet() const;
    const double& rayonCylindre() const;

    std::ostream& affiche( std::ostream& os ) const;

    Coord intrinseque( const Coord& pt ) const;
protected:
    /**
     * Axe de rotation du cylindre.
     */
    VecteurU Axe;
    /**
     * "Extrémité" du cylindre : c'est le centre du cercle de la base.
     */
    Coord Sommet;
    /**
     * Rayon du cylindre
     */
    double RayonCylindre;
};

#endif // BASECYLINDRE_HPP
